using System;

namespace CSharp.Commons.Pool
{
    /// <summary>
    /// 一个池的简单接口
    /// http://commons.apache.org/proper/commons-pool/api-2.7.0/index.html
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface ItemPool<T> : Closeable, IDisposable
    {
        /// <summary>
        /// 通过Factory或者其他机制创建一个对象，并放到对象池中的空闲
        /// </summary>
        void addItem();

        /// <summary>
        /// 获取对象池当中的一个实例
        /// </summary>
        /// <returns></returns>
        T borrowItem();

        /// <summary>
        /// 返回当前已经被获取的实例数量
        /// </summary>
        /// <returns></returns>
        int getNumActive();

        /// <summary>
        /// 返回当前空闲的实例数量
        /// </summary>
        /// <returns></returns>
        int getNumIdle();

        /// <summary>
        /// 返回对象池管理的所有实例数量
        /// </summary>
        /// <returns></returns>
        int getNumTotal();

        /// <summary>
        /// 废除对象
        /// </summary>
        /// <param name="item"></param>
        void invalidateItem(T item);

        /// <summary>
        /// 实例归还对象池
        /// </summary>
        /// <param name="item"></param>
        void returnItem(T item);
    }
}